/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.acap.googlemaps.manejadores;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

/**
 *
 * @author acap1505
 *
 * Clase Manejador, representa la conexion a la unidad de persistencia que se
 * estara usando como base para todos los movimientos de objetos.
 *
 * Esta conexion sera utilizada por todos los otros manejadores, por medio de la
 * herencia.
 */
public class Manejador {

    private static EntityManagerFactory factory;
    static private EntityManager entityManager = null;
    private static Manejador manager = null;
    private SimpleDateFormat formato_yyyy_MM = new SimpleDateFormat("yyyy-MM");
    private SimpleDateFormat formato_yyyy = new SimpleDateFormat("yyyy");
    private SimpleDateFormat formato_ISO = new SimpleDateFormat("yyyy-MM-dd");

    protected Manejador() {
    }

    public Connection getConnection() {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            // Setup the connection with the DB
            Connection con = DriverManager
                    .getConnection("jdbc:mysql://localhost:3306/mapwebapp", "newuser", "prieto");
            return con;
        } catch (SQLException ex) {
            Logger.getLogger(Manejador.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(Manejador.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

    /*
     * Metodo para insancia el manejador de entidades, una entidad es la representacion
     * de un objeto de una unidad de persistencia.
     */
    public static EntityManager getEntityManager() {
        factory = Persistence.createEntityManagerFactory("MGoogleMapsPU", System.getProperties());
        if (entityManager == null || !entityManager.isOpen()) {
            entityManager = factory.createEntityManager();
        }
        return entityManager;
    }

    public Boolean fechaBetween(Date fechaInicio, Date fechaFin, Date fechaActual) {
        return fechaInicio.compareTo(fechaActual) * fechaActual.compareTo(fechaFin) > 0;
    }

    public Boolean fechaMayor(Date fechaInicio, Date fechaActual) {
        return fechaInicio.compareTo(fechaActual) > 0;
    }

    public Date getInicioMesActual(Date fecha_a_devolver) {
        try {
            String fecha_con_formato = formato_yyyy_MM.format(fecha_a_devolver);
            fecha_con_formato = fecha_con_formato + "-1";

            fecha_a_devolver = formato_ISO.parse(fecha_con_formato);
        } catch (ParseException ex) {
            Logger.getLogger(Manejador.class.getName()).log(Level.SEVERE, null, ex);
        }

        return fecha_a_devolver;
    }

    public Date getFinMesActual(Date fecha_a_devolver) {

        try {

            Calendar calendario = Calendar.getInstance();
            calendario.setTime(fecha_a_devolver);
            Integer dia_maximo_mes = calendario.getActualMaximum(Calendar.DAY_OF_MONTH);
            String fecha_con_formato = formato_yyyy_MM.format(fecha_a_devolver);
            fecha_con_formato = fecha_con_formato + "-" + dia_maximo_mes;

            fecha_a_devolver = formato_ISO.parse(fecha_con_formato);
        } catch (Exception ex) {
            Logger.getLogger(Manejador.class.getName()).log(Level.SEVERE, null, ex);
        }


        return fecha_a_devolver;
    }

    public Date getInicioAno(Date fecha_a_devolver) {
        try {
            String fecha_con_formato = formato_yyyy.format(fecha_a_devolver);
            fecha_con_formato = fecha_con_formato + "-1-1";

            fecha_a_devolver = formato_ISO.parse(fecha_con_formato);
        } catch (ParseException ex) {
            Logger.getLogger(Manejador.class.getName()).log(Level.SEVERE, null, ex);
        }

        return fecha_a_devolver;
    }

    public Date getFinAno(Date fecha_a_devolver) {
        try {
            String fecha_con_formato = formato_yyyy.format(fecha_a_devolver);
            fecha_con_formato = fecha_con_formato + "-12-31";
            fecha_a_devolver = formato_ISO.parse(fecha_con_formato);
        } catch (Exception ex) {
            Logger.getLogger(Manejador.class.getName()).log(Level.SEVERE, null, ex);
        }


        return fecha_a_devolver;
    }

    public Long determinarMayor(Long[] lista) {
        Long mayor = new Long(0);

        for (Long temp : lista) {
            if (mayor < temp) {
                mayor = temp;
            }
        }
        return mayor;
    }
}
